package cn.hl.hm.util;

import cn.hl.hm.dao.CountrySubdivisionCodeMapper;
import cn.hl.hm.entity.CountrySubdivisionCode;
import cn.hl.hm.entity.Driver;
import cn.hl.hm.entity.Order;
import cn.hl.hm.entity.Route;
import cn.hl.hm.service.RouteService;
import com.vizhuo.logink.LoginkConfig;
import com.wondersgroup.cuteinfo.client.exchangeserver.exchangetransport.dao.IMessageTransporterDAO;
import com.wondersgroup.cuteinfo.client.exchangeserver.exchangetransport.factory.ITransportClientFactory;
import com.wondersgroup.cuteinfo.client.exchangeserver.exchangetransport.impl.USendRequset;
import com.wondersgroup.cuteinfo.client.exchangeserver.exchangetransport.impl.USendResponse;
import com.wondersgroup.cuteinfo.client.exchangeserver.usersecurty.UserToken;
import com.wondersgroup.cuteinfo.client.util.UserTokenUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
@Component
public class LoginkUtil {
	private final static SimpleDateFormat hhmmSdf = new SimpleDateFormat("yyyyMMddHHmmss");
	private static final Logger logger = LoggerFactory.getLogger(LoginkUtil.class);
	 @Autowired
	  CountrySubdivisionCodeMapper cscMapper;
	 
	    @Autowired
		 RouteService routeService;
	 
	    @Autowired
		@Qualifier("loginkConfig")
		private LoginkConfig loginkConfig;
	    
	    
	    public int sendXml(Order order ,Driver driver,int type){
	    	int result = 0;
	    	 IMessageTransporterDAO transporter = null;
	    	 try {
	    	 // 调用统一认证的令牌认证服务
	    	 UserToken token = UserTokenUtils.getTicket(
	    	 loginkConfig.getUsername(),
	    	 loginkConfig.getPassword(),
	    	 loginkConfig.getResourceId(),
	    	 loginkConfig.getAuthURL());
	    	 System.out.println("logink_username:"+loginkConfig.getUsername()+"tokenid:" + token.getTokenID());
	    	 // 接下来需要设置目标地址，发送报文的内容，包括报文类型Actiontype和具体报文xml
	    	 USendRequset sendReq = new USendRequset();
	    	 sendReq.setToaddress(loginkConfig.getToaddress().split(","));
	    	
	    	 // 设置待发送的业务报文
	    	 String xml =  getMessageToXML(order,driver,type);
	    	 if(xml==null){
	    		 return result;
	    	 }
//	    	3.无车业务ActionType LOGINK_CN_FREIGHTBROKER_WAYBILL  固定值
	    	 sendReq.setSendRequestTypeXML("LOGINK_CN_FREIGHTBROKER_WAYBILL",
	    	 xml );
	    	 // 最后，调用平台提供的发送服务发送报文
	    	 transporter = ITransportClientFactory.createMessageTransporter(
	    	 token, loginkConfig.getTargetURL());
	    	 long start = System.currentTimeMillis();
	    	 USendResponse responseLogink = transporter.send(sendReq);
	    	 long end = System.currentTimeMillis();
	    	 System.out.println("发送耗时：" + (end - start) + "毫秒，报文长度"
	    	 + xml.getBytes().length);
	    	 if (responseLogink.isSendResult()) {
	    		 result=1;
	    	 System.out.println("send success");
	    	 } else {
	    	 // 错误的情况下，会返回异常代码以及异常信息。异常代码请参照《3.2 共建指导性文件：交换接入》中的异常代码信息
	    	 System.out.println("send error");
	    	 System.out.println(responseLogink.getGenericFault().getMessage());
	    	 }
//	    	 System.out.println("");
	    	 } catch (Exception e) {
	    	 e.printStackTrace();
	    	 return result;
	    	 }
	    	 return result;
	    	 }
	    
	/**
	 * 
	 * @param order
	 * @param type 0:test 1：online
	 * @return
	 */
	public  String getMessageToXML(Order order,Driver driver,int type) {
		
		
		Route r = new Route();
		r.setId(order.getLineId());
		List<Route> route = routeService.selectRoute(r);
		CountrySubdivisionCode cscFrom=null;
		CountrySubdivisionCode cscTo=null;
		if(route!=null){
			  //此处有坑，按照名称检索地级市会存在相同名称的城市 例如朝阳，此处改动地方太多 暂时不动 by xianghan
			  cscFrom = cscMapper.selectCountrySubdivisionCode(route.get(0).getStartPoint());
			  cscTo =  cscMapper.selectCountrySubdivisionCode(route.get(0).getEndPoint());
			  if(cscFrom ==null ||cscTo ==null){
				  logger.info("封装报文异常：起始地、目的地未查询到");
				  return null;
			  }else{
				  if(cscFrom.getCsc() == null || cscTo.getCsc()==null){
					  logger.info("封装报文异常：起始地、目的地编码未查询到");
					  return null;
				  }
			  }
		}else{
			logger.info("封装报文异常：线路信息未查询到");
			return null;
		}
		if(driver.getPlateNumber()==null || driver.getRoadTransportCertificateNumber()==null || order.getUseTime()==null ){
			logger.info("封装报文异常：道路许可证，使用时间为空");
			return null;
		}
		
		String messageReferenceNumber = UUID.randomUUID();
		String sendCode ="";
		if(type==0){
			sendCode = "9752";
		}else{
			sendCode="13833";
		}
		/**业务类型代码 固定 1002996
		 *  1002996	干线普货运输	干线普货运输服务
			1003997	城市配送	在城市范围内进行配送
			1003998	农村配送	若发货方或收货方在农村地区即为农村物流
			1002998	集装箱运输	集装箱运输
			1003999	其他	其他
			
			ConsignmentDateTime	托运日期时间	无车承运人系统正式生成运单的日期时间，YYYYMMDDhhmmss
			DespatchActualDateTime	发运实际日期时间	货物装车后的发车时间YYYYMMDDhhmmss
			ConsignorInfo	发货方信息	
			CountrySubdivisionCode	国家行政区划代码	装货地点的国家行政区划代码，参照GB/T 2260《中华人民共和国行政区划代码》的代码，精确到区县。
			ConsigneeInfo	收货方信息	
			CountrySubdivisionCode	国家行政区划代码	收货地点的国家行政区划代码，参照GB/T 2260《中华人民共和国行政区划代码》的代码，精确到区县。
			TotalMonetaryAmount	货币总金额	托运人付给无车承运人企业的运输费用，货币单位为人民币，保留3位小数，如整数的话，以.000填充。如是一笔业务分几辆车运，需将托运人针对这笔业务付给无车承运人企业的运输费用分摊到每辆车上。
			LicensePlateTypeCode	牌照类型代码	01	大型汽车号牌	黄底黑字(含02式号牌部分)
												02	小型汽车号牌	蓝底白字(含02式号牌部分)
												99	其他号牌	
			VehicleNumber	车辆牌照号	必填。
			VehicleClassificationCode	车辆分类代码	详见代码集4.2.4
			VehicleTonnage	车辆载质量	默认单位：吨，保留两位小数，如整数的话，以.00填充。小数点不计入总长。
			VehicleClassificationCode	车辆分类代码
									H01	普通货车
									H02	厢式货车
									H04	罐式货车
									Q00	牵引车
									G01	普通挂车
									G03	罐式挂车
									G05	集装箱挂车
									H09	仓栅式货车
									H03	封闭货车
									H05	平板货车
									H06	集装箱车
									H07	自卸货车
									H08	特殊结构货车
									Z00	专项作业车
									G02	厢式挂车
									G07	仓栅式挂车
									G04	平板挂车
									G06	自卸挂车
									G09	专项作业挂车
									X91	车辆运输车
									X92	车辆运输车(单排)
		   RoadTransportCertificateNumber	道路运输证号	车辆的道路运输证号，填道路运输证证件编号
		   CargoTypeClassificationCode	货物类型分类代码
		    90	电子产品	Electronic product	以电能为工作基础的相关产品，如手机、电视等
			92	商品汽车	Automobile	商品运输车
			93	冷藏货物	Cold cargo	冷藏产品的货物
			94	大宗货物	Bulk cargo	大批量运输的货物，如能源产品、基础原材料和农副产品
			95	快速消费品	Fast-moving consumer goods	消费速度快的消费品
			96	农产品	agricultural products	农业中生产的供小批量销售物品，如高粱、稻子、玉米等。
			GoodsItemGrossWeight	货物项毛重	必填。重量单位以KGM千克填写数值，保留3位小数，如整数的话，以.000填充。小数点不计入总长。如是轻泡货等货物，请估算重量。如是一笔业务分几辆车运，需报送每辆车实际运输的货物重量。
			
		 */
		
		String consignmentDateTime = hhmmSdf.format(order.getCreateTime());
		String despatchActualDateTime = hhmmSdf.format(order.getUseTime());
		String goodsReceiptDateTime="";
		if(order.getUserEnsureTime()==null){
			goodsReceiptDateTime=hhmmSdf.format(order.getCreateTime());
		}else{
			goodsReceiptDateTime=hhmmSdf.format(order.getUserEnsureTime());
		}
		
		String  totalMonetaryAmount = order.getPayPrice().toString();
		String vehicleNumber = driver.getPlateNumber();
		String vehicleTonnage = driver.getVehicleLoad();
		String goodsName="";
		if(order.getGoodsName()==null){
			goodsName="百货";
		}else{
			goodsName = order.getGoodsName();
		}
		 String xml = "";
		 xml += "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>" +
		 "<Root>"
		 + " <Header>"
		 + " <MessageReferenceNumber>"+messageReferenceNumber+"</MessageReferenceNumber>"
		 + " <DocumentName>无车承运人电子路单</DocumentName>"
		 + " <DocumentVersionNumber>2015WCCYR</DocumentVersionNumber>"
		 + " <SenderCode>"+loginkConfig.getUsername()+"</SenderCode>"
		 + " <RecipientCode>wcjc0001</RecipientCode>"
		 + " <MessageSendingDateTime>"+hhmmSdf.format(new Date())+"</MessageSendingDateTime>"
		 + " <MessageFunctionCode>9</MessageFunctionCode>"
		 + " </Header>"
		 + "<Body>"
		 + " <OriginalDocumentNumber>"+order.getOrderCode()+"</OriginalDocumentNumber>"
		 + " <ShippingNoteNumber>"+order.getOrderCode()+"</ShippingNoteNumber>"
		 + " <Carrier>新疆华凌物流配送有限公司</Carrier>"
		 + " <ConsignmentDateTime>"+consignmentDateTime+"</ConsignmentDateTime>"
		 + " <BusinessTypeCode>1002996</BusinessTypeCode>"
		 + " <DespatchActualDateTime>"+despatchActualDateTime+"</DespatchActualDateTime>"
		 + " <GoodsReceiptDateTime>"+goodsReceiptDateTime+"</GoodsReceiptDateTime>"
		 + " <ConsignorInfo>"
		 + " <CountrySubdivisionCode>"+cscFrom.getCsc()+"</CountrySubdivisionCode>"
		 + " </ConsignorInfo>"
		 + "<ConsigneeInfo>"
		 + " <CountrySubdivisionCode>"+cscTo.getCsc()+"</CountrySubdivisionCode>"
		 + " </ConsigneeInfo>"
		 + " <PriceInfo>"
		 + " <TotalMonetaryAmount>"+totalMonetaryAmount+"</TotalMonetaryAmount>"
		 + " </PriceInfo>"
		 + " <VehicleInfo>"
		 + " <LicensePlateTypeCode>01</LicensePlateTypeCode>"
		 + " <VehicleNumber>"+vehicleNumber+"</VehicleNumber>"
		 + " <VehicleClassificationCode>H01</VehicleClassificationCode>"
		 + " <VehicleTonnage>"+vehicleTonnage+"</VehicleTonnage>"
		 + "<RoadTransportCertificateNumber>"+driver.getRoadTransportCertificateNumber()+"</RoadTransportCertificateNumber>"
		 + " <GoodsInfo>"
		 + " <DescriptionOfGoods>百货</DescriptionOfGoods>"
		 + " <CargoTypeClassificationCode>94</CargoTypeClassificationCode>"
		 + " <GoodsItemGrossWeight>30000.000</GoodsItemGrossWeight>"
		 + " </GoodsInfo>"
		 + "</VehicleInfo>"
		 + " </Body>"
		 + "</Root>";
		 return xml;
		 }

}
